#include <iostream>
#include <string>
#include <cerrno>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

void Usage(std::string proc)
{
    std::cout<<"Usage: \n\t"<<proc<<"server_ip server_port"<<std::endl;
}

int main(int argc,char *argv[])
{
    if(argc!=3)
    {
        Usage(argv[0]);
        return 0;
    }

    //创建套接字，打开网络文件
    int sock=socket(AF_INET,SOCK_DGRAM,0);
    if(sock<0)
    {
        std::cerr<<"socket error : "<<errno<<std::endl;
        return 1;
    }

    //2.客户端
    //客户端也要有IP和port
    //不需要显示bind，一旦现实bind，就必须明确，client要和哪一个port关联；
    //client指明的端口号，在client端一定会有吗，有可能被占用，被占用导致处理恩他无法使用；一般由操作系统自动bind
    //client正常发送数据的时候，os会自动给你bind

    //使用服务
    struct sockaddr_in server;
    server.sin_family=AF_INET;
    server.sin_port=htons(atoi(argv[2]));
    server.sin_addr.s_addr=inet_addr(argv[1]);
    while(1)
    {
        std::string message;
        std::cout<<"输入# ";
        std::cin>>message;

        sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));

        struct sockaddr_in tmp;
        socklen_t len=sizeof(tmp);
        char buffer[1024];
        recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&tmp,&len);

        std::cout<<"server echo# "<<buffer<<std::endl;

    }

    std::cout<<"hello client"<<std::endl;
    return 0;    
}